#################
import re,csv

class ReadParamFile:
    """read the Param file from the specified folder, columns are seperated by tab"""
    def __init__(self, inFileFullName):
        self.FileName=inFileFullName
        self.FileData=[]
    def setFileName(self, inFileFullName):
        self.FileName=inFileFullName
        self.FileData=[]
    def rFile(self):
        f = open(self.FileName,'r')
        s=''
        lst=[]
        for line in f:
            s=line
            lst=s.split() #split by tab,2nd parameter set to empty
            self.FileData.append(lst)
        f.close()
        return self.FileData


class ChgTargetFile:
    """Change target file with the given data dict"""
    """
    update Str: dict{"Key=oldStr":"Value=NewStr"}
    remove property: dict{"Key":"Value=removedProperty"}
    update property value: dict{"Key":"[Value1=ProName,Value2=NewProValue]"}
    """
    """
    dict have a issue for key is unique,now change to list[key,proty,protyValue]
    """
    def __init__(self, inFileFullName, inChgData):
        self.ChgBaseData=[]
        self.ChgBaseData=inChgData
        self.ChgFileName=inFileFullName
    def setFileName(self, inFileFullName):
        self.ChgFileName=inFileFullName
    def setChgData(self, inChgData):
        self.ChgBaseData=inChgData
    def wFile(self, inNewLines):
        #if file name not exit, it will create
        #if folder not exits, it will raise IOError
        f=open(self.ChgFileName, 'w')
        for line in inNewLines:
            f.writelines(line)
        f.close()
    def wCSVFile(self,inLstHeader,inDict):
        resultFName='d:\\tmp\\py\\result.csv'
        with open(resultFName,'wb') as f:
            w=csv.DictWriter(f,inLstHeader)
            w.writeheader()
            w.writerows(inDict)
        return resultFName
    def rFile(self):
        f =open(self.ChgFileName, 'r') 
        allines=[]
        allines = f.readlines()
        f.close()
        return allines
    def UpdateStr(self, inLines):
        newLines=[]
        for line in inLines:
            newline=line
            for lst in self.ChgBaseData:
                s1=lst[0]
                s2=lst[1]
                if newline.find(s1) <> -1:
                    newline=re.sub(s1,s2,newline)
            newLines.append(newline)
        return newLines
    def RmPropty(self, inLines):
        newLines=[]
        for line in inLines:
            newline=line
            for lst in self.ChgBaseData:
                s1=lst[0]
                s2=lst[1]
                if '"'+s1+'"' in newline: #to match the whole name
                    newline=re.sub(s2 + '=".*?" ','',newline)
##                    #newline=re.sub(' '*2,' ',newline)
##                    #replace multiple space with only one space
##                    #the below first sub, will replace even number spaces to
##                    #one space, and odd number spaces to two spaces. the second
##                    #sub function replace 2 spaces with only one space
##                    newline=re.sub(r'([ ]+)\1',r' ',newline)
##                    newline=re.sub(r'([ ]+)\1',r' ',newline)
            newLines.append(newline)
        return newLines
    def UpdPropty(self, inLines):
        newLines=[]
        for line in inLines:
            newline=line
            for lst in self.ChgBaseData:
                s1=lst[0]
                s2=lst[1]
                s3=lst[2]
                if re.search(r'\W'+s1+'\W',newline): #match whole word of name
                    newline=re.sub(s2 + '=".*?"',s2+'="'+s3+'"',newline)
            newLines.append(newline)
        return newLines
    def getInfobyName(self, inLines):
        #get any value(name or property's) from the file based on key (name
        #or type, output to a csv file
        lHeader=[]
        lHeader.append('ItemType')
        lValue=[]        
        for line in inLines:
            for lst in self.ChgBaseData:
                lDict={}
                s1=lst[0]
                if re.search(r'\W'+s1+'\W',line):
                    line=line.strip()
                    if re.match('<\w+.*?>',line):
                        rslt1=re.split('[ |<|/>]',line)
                        for l1 in rslt1:
                            if l1.strip():
                                l1=l1.strip()
                                rslt2=re.split('="|"',l1)
                                if len(rslt2)==1:
                                    lDict['ItemType']=rslt2[0]
                                else:                                    
                                    lDict[rslt2[0]]=rslt2[1]
                                    if rslt2[0] not in lHeader:
                                        lHeader.append(rslt2[0])
                        lValue.append(lDict)
        return lHeader, lValue



#################



from updateXml import ReadParamFile,ChgTargetFile

c1=ReadParamFile('d:\\tmp\\py\\2.1.txt')
c1.rFile()
c2=ChgTargetFile('d:\\tmp\\py\\3.1.xml',c1.FileData )
#test replace string function
rline=[]
rline=c2.rFile()
lines=[]
lines=c2.UpdateStr(rline)
c2.wFile(lines)
print 'Update {0} succefully'.format(c2.ChgFileName)
#test remove property function
c1.setFileName('d:\\tmp\\py\\2.2.txt')
c1.rFile()
c2.setFileName('d:\\tmp\\py\\3.2.xml')
c2.setChgData(c1.FileData)
c2.wFile(c2.RmPropty(c2.rFile()))
print 'Remove Property from file {0} succefully'.format(c2.ChgFileName)
#test change property's value function
c1.setFileName('d:\\tmp\\py\\2.3.txt')
c1.rFile()
c2.setFileName('d:\\tmp\\py\\3.3.xml')
c2.setChgData(c1.FileData)
c2.wFile(c2.UpdPropty(c2.rFile()))
print 'change Property value from file {0} succefully'.format(c2.ChgFileName)
#test get Info by key word in xml
c1.setFileName('d:\\tmp\\py\\2.4.txt')
c1.rFile()
c2.setFileName('d:\\tmp\\py\\3.4.xml')
c2.setChgData(c1.FileData)
lines=c2.rFile()
lst1,lst2=c2.getInfobyName(lines)
s=c2.wCSVFile(lst1,lst2)
print 'get infor from {0} complete, result file is {1}'.format(c2.ChgFileName,s)

